// async function fn() {
//   console.log('start')
//   a()
//   console.log(res)
//   console.log('end')
// }

// fn()

// function a() {
//   // return Promise.resolve(123)
//   return new Promise(resolve => {
//     resolve(res)
//   })
// }


// a().then()





/*
  原生 JS 发送一个 ajax 请求的过程
    1. 创建 ajax 对象
      => const xhr = new XMLHttpRequest()
    2. 配置请求信息
      => xhr.open(请求方式, 请求地址, 是否异步)
    3. 发送本次请求
      => xhr.send()
    4. 注册事件
      => xhr.onreadystatechange = function () {
        判断状态码 [ xhr.state === 4 表示本次请求完成了 ][ xhr.status === 200 表示本次请求成功了 ]
        if (xhr.state === 4 && xhr.status === 200) {
          console.log(xhr.responseText)
        } else {
          console.log('本次请求失败了')
        }
      }
  因为每次请求都需要写这些步骤, 我选择把四个步骤封装起来
*/

// 原始封装 ajax
// function ajax(options) {
//   // 1. 参数合理性判断( url必填, method是get或者post, data是一个对象,... )

//   // 2. 封装过程
//   const xhr = new XMLHttpRequest()
//   xhr.open(options.method, options.url, options.async)
//   xhr.send(options.data || '')
//   xhr.onreadystatechange = function () {
//     if (xhr.state === 4 && xhr.status === 200) {
//       // console.log(xhr.responseText)
//       options.success && options.success(xhr.responseText)
//     } else {
//       // console.log('本次请求失败了')
//       options.error && options.error('失败原因')
//     }
//   }
// }


// ajax({
//   url: '/a',
//   success: () => {},
//   error: () => {}
// })


// 使用 Promise 的形式封装 ajax
// function pAjax(options) {
//   // 1. 参数合理性判断( url必填, method是get或者post, data是一个对象,... )

//   // 2. 封装过程
//   const xhr = new XMLHttpRequest()
//   xhr.open(options.method, options.url, options.async)
//   xhr.send(options.data || '')

//   const p = new Promise((resolve, reject) => {
//     xhr.onreadystatechange = function () {
//       if (xhr.state === 4 && xhr.status === 200) {
//         // console.log(xhr.responseText)
//         resolve(xhr.responseText)
//       } else {
//         // console.log('本次请求失败了')
//         reject('失败原因')
//       }
//     }
//   })

//   return p
// }

// async function fn() {
//   const r1 = await pAjax({ url: '/a' })
//   const r2 = await pAjax({ url: '/b', data: { a: r1.a } })
// }

// 链式调用
// pAjax({ url: '/a' })
//   .then(r1 => {
//     return pAjax({ url: '/b', data: { a: r1.a } })
//   })
//   .then(r2 => {

//   })

// await 后面必须是 Promise 实例对象
// async function fn() {
//   console.log('start')
//   const res = await setTimeout(() => {
//     console.log(123)
//   })
//   console.log(res)
//   console.log('end')
// }

// fn()
